package com.hsyt.pfc.redis.string;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

/**
 * @Description: redis string 操作接口
 * @ClassName: RedisStringHandler
 * @Package: com.hsyt.pfc.redis.string
 * @Author: wangze@hsyuntai.com
 * @Date: 2018/8/10 11:43
 * @Copyright: 版权归 HSYUNTAI 所有
 */
@Component
public class RedisStringHandler {

    @Autowired
    private StringRedisTemplate redisTemplate;

    private static StringRedisTemplate stringRedisTemplate;

    @PostConstruct
    private void init() {
        stringRedisTemplate = this.redisTemplate;
    }

    public StringRedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * @Description: String（字符串） ： 返回 key 所关联的字符串值。
     * 								 如果 key 不存在那么返回特殊值 nil 。
     * 								假如 key 储存的值不是字符串类型，返回一个错误，因为 GET 只能用于处理字符串值。
     * @param key
     * @return  当 key 不存在时，返回 nil ，否则，返回 key 的值。如果 key 不是字符串类型，那么返回一个错误。
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:56
     */
    public static String get(final String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * @Description: String（字符串） ： 返回 key 中字符串值的子字符串，字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
     * 								负数偏移量表示从字符串最后开始计数， -1 表示最后一个字符， -2 表示倒数第二个，以此类推。
     * 								getRange 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求
     * @param key
     * @param start
     * @param end
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午3:29:18
     */
    public static String getRange(final String key,long start,long end){
        return stringRedisTemplate.opsForValue().get(key, start, end);
    }

    /**
     * @Description: String（字符串） ： 将给定 key 的值设为 value ，并返回 key 的旧值(old value)。
     * @param key
     * @param value
     * @return  返回给定 key 的旧值。当 key 没有旧值时，也即是， key 不存在时，返回 nil 。
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午3:31:15
     */
    public static String getSet(final String key,String value){
        return stringRedisTemplate.opsForValue().getAndSet(key, value);
    }

    /**
     * @Description:  String（字符串） ： 将字符串值 value 关联到 key
     * 								   如果 key 已经持有其他值， SET 就覆写旧值，无视类型。
     * @param key
     * @param value
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:17:03
     */
    public static void set(final String key,String value){
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * @Description: String（字符串） ： 将字符串值 value 关联到 key ，并设置生命周期，以秒为单位
     * 								 对于某个原本带有生存时间（TTL）的键来说， 当 SET 命令成功在这个键上执行时， 这个键原有的 TTL 将被清除。
     * @param key
     * @param value
     * @param seconds
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:17:12
     */
    public static void set(final String key,String value,int seconds){
        stringRedisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
    }

    /**
     * @Description: String（字符串） ：  如果 key 已经存在并且是一个字符串， APPEND 命令将 value 追加到 key 原来的值的末尾。
     * 								 如果 key 不存在， APPEND 就简单地将给定 key 设为 value ，就像执行 SET key value 一样。
     * @param key
     * @param value
     * @return 追加 value 之后， key 中字符串的长度。
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午3:34:29
     */
    public static int append(final String key,String value){
        return stringRedisTemplate.opsForValue().append(key, value);
    }

}
